<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
	<title>query 和 filter 上下文 | ElasticSearch 7.7 权威指南中文版</title>
	<meta name="keywords" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <meta name="description" content="ElasticSearch 权威指南中文版, elasticsearch 7, es7, 实时数据分析，实时数据检索" />
    <!-- Give IE8 a fighting chance -->
    <!--[if lt IE 9]>
    <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
    <![endif]-->
	<link rel="stylesheet" type="text/css" href="../static/styles.css" />
	<script>
	var _link = 'query-filter-context.html';
    </script>
</head>
<body>
<div class="main-container">
    <section id="content">
        <div class="content-wrapper">
            <section id="guide" lang="zh_cn">
                <div class="container">
                    <div class="row">
                        <div class="col-xs-12 col-sm-8 col-md-8 guide-section">
                            <div style="color:gray; word-break: break-all; font-size:12px;">原英文版地址: <a href="https://www.elastic.co/guide/en/elasticsearch/reference/7.7/query-filter-context.html" rel="nofollow" target="_blank">https://www.elastic.co/guide/en/elasticsearch/reference/7.7/query-filter-context.html</a>, 原文档版权归 www.elastic.co 所有<br/>本地英文版地址: <a href="../en/query-filter-context.html" rel="nofollow" target="_blank">../en/query-filter-context.html</a></div>
                        <!-- start body -->
                  <div class="page_header">
<strong>重要</strong>: 此版本不会发布额外的bug修复或文档更新。最新信息请参考 <a href="https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html" rel="nofollow">当前版本文档</a>。
</div>
<div id="content">
<div class="breadcrumbs">
<span class="breadcrumb-link"><a href="index.html">Elasticsearch 权威指南 [7.7]</a></span>
»
<span class="breadcrumb-link"><a href="query-dsl.html">查询领域特定语言(Query DSL)</a></span>
»
<span class="breadcrumb-node">query 和 filter 上下文</span>
</div>
<div class="navheader">
<span class="prev">
<a href="query-dsl.html">« 查询 DSL</a>
</span>
<span class="next">
<a href="compound-queries.html">复合查询 »</a>
</span>
</div>
<div class="chapter">
<div class="titlepage"><div><div>
<h2 class="title">
<a id="query-filter-context"></a>query 和 filter 上下文
</h2>
</div></div></div>
<h3>
<a id="relevance-scores"></a>相关性评分 (relevance scores)
</h3>
<p>
默认情况下，Elasticsearch 根据 <span class="strong strong"><strong>相关性评分(relevance score)</strong></span> 对匹配到的搜索结果进行排序，这个分数用来衡量每个文档与查询的匹配程度。
</p>
<p>
相关性分数是一个正浮点数，在 <a class="xref" href="search-request-body.html" title="Request Body Search">search</a> API 返回结果的 <code class="literal">_score</code> 元字段中。

<code class="literal">_score</code>越高，文档的相关性就越强。

虽然每种查询类型都可以不同地计算关联分数，但分数计算也取决于查询子句是在 <span class="strong strong"><strong>query</strong></span> 上下文中运行还是在 <span class="strong strong"><strong>filter</strong></span> 上下文中运行。
</p>
<h3>
<a id="query-context"></a>query 的上下文
</h3>
<p>
在 query 上下文中，查询子句回答“<em>此文档与此查询子句的匹配程度如何？</em>”。

除了决定文档是否匹配之外，查询子句还计算文档的相关性得分（在元字段 <code class="literal">_score</code> 中显示）。
</p>
<p>
query 上下文在查询子句传递给 <code class="literal">query</code> 参数(例如 <a class="xref" href="search-search.html#request-body-search-query">search</a> API 中的 <code class="literal">query</code> 参数)时生效。
</p>
<h3>
<a id="filter-context"></a>filter 的上下文
</h3>
<p>
在 filter 上下文中，查询子句回答“<em>此文档与此查询子句匹配吗？</em>”。

答案是简单的"是"或"否"--不会计算分数。

filter 上下文主要用于过滤结构化数据，比如：
</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
<em>这个 <code class="literal">timestamp</code> 是否落在 2015 - 2016 范围内?</em>
</li>
<li class="listitem">
<em><code class="literal">status</code> 字段是否设置为<code class="literal">"published"</code></em>?
</li>
</ul>
</div>
<p>
Elasticearch 会自动缓存经常使用的 filter，以提高性能。
</p>
<p>
每当查询子句传递给 filter 参数时，过滤器上下文就生效，例如 <a class="xref" href="query-dsl-bool-query.html" title="Boolean query"><code class="literal">bool</code></a> 查询中的 <code class="literal">filter</code> 或 <code class="literal">must_not</code> 参数，<a class="xref" href="query-dsl-constant-score-query.html" title="Constant score query"><code class="literal">constant_score</code></a> 查询中的 <code class="literal">filter</code> 参数，或者 <a class="xref" href="search-aggregations-bucket-filter-aggregation.html" title="Filter Aggregation"><code class="literal">filter</code></a> 聚合。
</p>
<h3>
<a id="query-filter-context-ex"></a>关于 query 和 filter 上下文的例子
</h3>
<p>
下面是一个在 <code class="literal">search</code> API 中的 query 和 filter 上下文中使用的查询子句的示例。

该查询将匹配满足以下所有条件的文档：
</p>
<div class="ulist itemizedlist">
<ul class="itemizedlist">
<li class="listitem">
字段 <code class="literal">title</code> 包含单词 <code class="literal">search</code>。
</li>
<li class="listitem">
字段 <code class="literal">content</code> 包含单词 <code class="literal">elasticsearch</code>。
</li>
<li class="listitem">
字段 <code class="literal">status</code> 完全匹配 <code class="literal">published</code>。
</li>
<li class="listitem">
字段 <code class="literal">publish_date</code> 包含从 2015-1-1 之后（大于）的日期。
</li>
</ul>
</div>
<div class="pre_wrapper lang-console">
<pre class="programlisting prettyprint lang-console">GET /_search
{
  "query": { <a id="CO35-1"></a><i class="conum" data-value="1"></i>
    "bool": { <a id="CO35-2"></a><i class="conum" data-value="2"></i>
      "must": [
        { "match": { "title":   "Search"        }},
        { "match": { "content": "Elasticsearch" }}
      ],
      "filter": [ <a id="CO35-3"></a><i class="conum" data-value="3"></i>
        { "term":  { "status": "published" }},
        { "range": { "publish_date": { "gte": "2015-01-01" }}}
      ]
    }
  }
}</pre>
</div>
<div class="console_widget" data-snippet="snippets/92.console"></div>
<div class="calloutlist">
<table border="0" summary="Callout list">
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO35-1"><i class="conum" data-value="1"></i></a></p>
</td>
<td align="left" valign="top">
<p><code class="literal">query</code> 参数指示查询上下文。</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO35-2"><i class="conum" data-value="2"></i></a></p>
</td>
<td align="left" valign="top">
<p>
<code class="literal">bool</code> 和两个 <code class="literal">match</code> 子句用于 query 上下文，这表示它们用于对每个文档的匹配程度进行评分。
</p>
</td>
</tr>
<tr>
<td align="left" valign="top" width="5%">
<p><a href="#CO35-3"><i class="conum" data-value="3"></i></a></p>
</td>
<td align="left" valign="top">
<p>
<code class="literal">filter</code> 参数指示 filter 上下文。

其中 <code class="literal">term</code> 和 <code class="literal">range</code> 子句用于 filter 上下文。

它们将过滤掉不匹配的文档，但不会影响匹配文档的得分。
</p>
</td>
</tr>
</table>
</div>
<div class="warning admon">
<div class="icon"></div>
<div class="admon_content">
<p>
在 query 上下文中为查询计算的分数是一个单精度浮点数；它们的有效精度只有24位。

超过有效精度的分数值将被转换为失去精度的浮点数。
</p>
</div>
</div>
<div class="tip admon">
<div class="icon"></div>
<div class="admon_content">
<p>
在 query 上下文中使用查询子句，用于应该参与计算匹配文档得分的条件(即文档匹配的好坏)，而所有其他查询子句(不需要计算得分的)应该放在 filter 上下文中。
</p>
</div>
</div>
</div>
<div class="navfooter">
<span class="prev">
<a href="query-dsl.html">« 查询 DSL</a>
</span>
<span class="next">
<a href="compound-queries.html">复合查询 »</a>
</span>
</div>
</div>

                  <!-- end body -->
                        </div>
                        <div class="col-xs-12 col-sm-4 col-md-4" id="right_col">
                        
                        </div>
                    </div>
                </div>
            </section>
        </div>
    </section>
</div>
<script src="../static/cn.js"></script>
</body>
</html>